const { body } = require('express-validator')
const validate = require('./error-back')
const { User } = require('../../model/index')

const ErrorMessage = {
  NOT_EMPTY: '不能为空',
  USERNAME_TOO_SHORT: '用户名长度不能小于3',
  INVALID_EMAIL: '邮箱格式不正确',
  INVALID_PHONE: '手机号格式不正确',
  EMAIL_REGISTERED: '邮箱已被注册',
  PHONE_REGISTERED: '手机号已被注册',
}

// 抽取重复的数据库查询逻辑到单独的函数
async function checkUniqueField(field, value, errorMessage) {
  try {
    const isRepeat = await User.findOne({ [field]: value })
    if (isRepeat) {
      return Promise.reject(errorMessage)
    }
  } catch (error) {
    return Promise.reject('数据库操作失败')
  }
}
// 登录验证
module.exports.register = validate([
  // bail 当前验证通过才能进行下一个验证
  body('username')
    .notEmpty()
    .withMessage(`用户名${ErrorMessage.NOT_EMPTY}`)
    .bail()
    .isLength({ min: 3 })
    .withMessage(ErrorMessage.USERNAME_TOO_SHORT)
    .bail(),
  body('password')
    .notEmpty()
    .withMessage(`密码${ErrorMessage.NOT_EMPTY}`)
    .bail()
    .isLength({ min: 3 })
    .withMessage(ErrorMessage.USERNAME_TOO_SHORT)
    .bail(),
  body('email')
    .notEmpty()
    .withMessage(`邮箱${ErrorMessage.NOT_EMPTY}`)
    .bail()
    .isEmail()
    .withMessage(ErrorMessage.INVALID_EMAIL)
    .bail()
    // 支持自定义校验
    .custom(async val => await checkUniqueField('email', val, ErrorMessage.EMAIL_REGISTERED))
    .bail(),
  body('phone')
    .notEmpty()
    .withMessage(`手机号${ErrorMessage.NOT_EMPTY}`)
    .bail()
    .isMobilePhone()
    .withMessage(ErrorMessage.INVALID_PHONE)
    .bail()
    // 支持自定义校验
    .custom(async val => await checkUniqueField('phone', val, ErrorMessage.PHONE_REGISTERED))
    .bail(),
])

// 登录验证
module.exports.login = validate([
  body('email')
    .notEmpty()
    .withMessage(`邮箱${ErrorMessage.NOT_EMPTY}`)
    .bail()
    .isEmail()
    .withMessage(ErrorMessage.INVALID_EMAIL)
    .bail()
    .custom(async val => {
      const emailValid = await User.findOne({ email: val })
      if (!emailValid) {
        return Promise.reject('邮箱未注册')
      }
    }),
  body('password').notEmpty().withMessage(`密码${ErrorMessage.NOT_EMPTY}`).bail(),
])

module.exports.update = validate([
  body('email')
    // .isEmail()
    // .withMessage('邮箱格式不正确')
    // .bail()
    .custom(async val => {
      const emailValid = await User.findOne({ email: val })
      if (emailValid) {
        return Promise.reject('邮箱已经注册')
      }
    }),
  body('username').custom(async val => {
    const usernameValid = await User.findOne({ username: val })
    if (usernameValid) {
      return Promise.reject('用户已经注册')
    }
  }),
  body('phone').custom(async val => {
    const phoneValid = await User.findOne({ phone: val })
    if (phoneValid) {
      return Promise.reject('手机号已经注册')
    }
  }),
])
